El método de selección de alternativas multicriterio AHP (Analytic Hierarchy Process) se fundamenta en la teoría de la toma de decisiones multicriterio (MCA) y la teoría de la jerarquía analítica. Fue desarrollado por Thomas Saaty en la década de 1970 (Thomas L. Saaty 1977), con varias revisiones posteriores (Thomas L. Saaty 2001; Thomas L. Saaty and Tran 2007), y se utiliza para tomar decisiones cuando se deben considerar múltiples criterios y alternativas. Tradicionalmente, el método AHP se ha utilizado en investigaciones del ámbito de las ingenierías, ciencias sociales, económicas y empresariales, e igualmente en la toma de decisiones donde intervienen datos geoespaciales (Thomas L. Saaty 2013; Darko et al. 2019; Podvezko 2009; Subramanian and Ramanathan 2012; Breaz, Bologa, and Racz 2017). Recientemente, fue usado de forma eficiente en la selección de sitios idóneos para la instalación de estaciones meteoclimáticas en Perú (Rojas Briceño et al. 2021).
El método AHP consiste en descomponer un problema complejo en una estructura jerárquica de criterios y subcriterios, para luego comparar distintas alternativas en función de cada uno de dichos criterios. El proceso se realiza en varias etapas, que incluyen, identificar los objetivos y criterios relevantes para el problema, crear una estructura jerárquica de los criterios y subcriterios, comparar los criterios y subcriterios mediante una matriz de comparación en parejas (paso clave), calcular los valores de prioridad de cada criterio (paso clave), comparar las alternativas, calcular los valores de prioridad de cada alternativa en función de cada criterio y, finalmente, calcular los valores totales de prioridad de cada alternativa.
El método AHP es ampliamente utilizado en la toma de decisiones y en la planificación estratégica, ya que permite elegir entre varias opciones considerando valoraciones de criterios, y porque tiene en cuenta la importancia relativa de los criterios elegidos. Esta importancia relativa se asigna, normalmente, por medio de consultas hechas a personas con experiencia en el área de conocimiento donde se enmarque el problema en cuestión.
En este estudio, aplicamos AHP para seleccionar sitios idóneos donde instalar estaciones meteoclimáticas en República Dominicana, garantizando la eficiencia de la red, maximizando recursos y evitando redundancia información. Para ello, nos apoyamos tanto en fuentes de información geoespacial sistemáticamente producidas, como en consultas a personas con experiencia en temas climáticos y meteorológicos.
El método AHP se utiliza para seleccionar la mejor opción entre diferentes alternativas, utilizando criterios de selección ponderados por personas con conocimiento del problema (Thomas L. Saaty 2013). Las repuestas originales normalmente deben organizarse y recodificarse y, posteriormente, se debe evaluar su consistencia. A continuación, se seleccionan las respuestas consistentes, o se ajustan las inconsistentes, y se establece la ponderación de criterios. Finalmente, la ponderación definida, se aplica a las fuentes de información disponible para obtener una lista de alternativas, de entre las cuales, se selecciona la más idónea de acuerdo con los criterios definidos.
Tanto el diseño de los formularios, como el procesamiento de respuestas y la ponderación de criterios, los realizamos empleando lenguajes de programación. Para diseñar los formularios, empleamos paquetes y funciones de Python, mientras que para los análisis nos auxiliamos del paquete ahpsurvey y otros del entorno de programación estadística R, diseñado para tales fines (Cho 2019; R Core Team 2021; Wickham et al. 2019). Describimos estos pasos detalladamente en la sección Información suplementaria.
Las tablas 1 y 2 muestran las preferencias individuales y agregadas, respectivamente, de las personas entrevistadas cuyas respuestas fueron consistentes.
kable_prefind <- flujo_completo_ahp$indpref %>%
mutate(`Persona consultada` = cr_indicador[cr_indicador[,1]==1, 'Persona consultada']) %>%
relocate(`Persona consultada`) %>%
estilo_kable(titulo = 'Preferencias individuales',
cubre_anchura = F) %>%
kable_styling(position = 'left') %>%
column_spec(column = 1:2, width = "10em")
kable_prefind
| Persona consultada | acce | temp | pluv | habi | agua | pend | inso | elev | CR | top1 | top2 | top3 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 0.04 | 0.22 | 0.32 | 0.16 | 0.02 | 0.02 | 0.08 | 0.14 | 0.09 | acce_pend | pluv_elev | pend_inso |
| 2 | 0.09 | 0.23 | 0.25 | 0.07 | 0.07 | 0.03 | 0.11 | 0.16 | 0.07 | habi_agua | habi_inso | pluv_agua |
| 4 | 0.06 | 0.05 | 0.28 | 0.05 | 0.06 | 0.06 | 0.31 | 0.14 | 0.07 | temp_inso | habi_inso | temp_pend |
| 9 | 0.10 | 0.19 | 0.25 | 0.07 | 0.09 | 0.04 | 0.22 | 0.04 | 0.06 | habi_agua | agua_elev | acce_elev |
kable_prefagg <- flujo_completo_ahp$aggpref %>%
as.data.frame() %>%
rownames_to_column('Variable') %>%
mutate(Variable = factor(Variable, labels = variables[sort(names(variables))])) %>%
estilo_kable(titulo = 'Preferencias agregadas',
cubre_anchura = F) %>%
kable_styling(position = 'left') %>%
column_spec(column = 1:2, width = "10em")
kable_prefagg
| Variable | AggPref | SD.AggPref |
|---|---|---|
| distancia a accesos | 0.07 | 0.03 |
| estacionalidad térmica | 0.17 | 0.08 |
| estacionalidad pluviométrica | 0.27 | 0.04 |
| heterogeneidad de hábitat | 0.09 | 0.05 |
| distancia a cuerpos de agua | 0.06 | 0.03 |
| pendiente | 0.04 | 0.02 |
| horas de insolación | 0.18 | 0.11 |
| elevación | 0.12 | 0.05 |
source('R/funciones.R')
library(sf)
library(kableExtra)
res_h3 <- 7 #Escribir un valor entre 4 y 7, ambos extremos inclusive
ruta_ez_gh <- 'https://raw.githubusercontent.com/geofis/zonal-statistics/'
# ez_ver <- 'da5b4ed7c6b126fce15f8980b7a0b389937f7f35/'
ez_ver <- 'd7f79365168e688f0d78f521e53fbf2da19244ef/'
ind_esp_url <- paste0(ruta_ez_gh, ez_ver, 'out/all_sources_all_variables_res_', res_h3, '.gpkg')
ind_esp_url
## [1] "https://raw.githubusercontent.com/geofis/zonal-statistics/d7f79365168e688f0d78f521e53fbf2da19244ef/out/all_sources_all_variables_res_7.gpkg"
if(!any(grepl('^ind_esp$', ls()))){
ind_esp <- st_read(ind_esp_url, optional = T, quiet = T)
st_geometry(ind_esp) <- "geometry"
ind_esp <- st_transform(ind_esp, 32619)
}
if(!any(grepl('^pais_url$', ls()))){
pais_url <- paste0(ruta_ez_gh, ez_ver, 'inst/extdata/dr.gpkg')
pais <- invisible(st_read(pais_url, optional = T, layer = 'pais', quiet = T))
st_geometry(pais) <- "geometry"
pais <- st_transform(pais, 32619)
}
if(!any(grepl('^ind_esp_inters$', ls()))){
ind_esp_inters <- st_intersection(pais, ind_esp)
colnames(ind_esp_inters) <- colnames(ind_esp)
ind_esp_inters$area_sq_m <- units::drop_units(st_area(ind_esp_inters))
ind_esp_inters$area_sq_km <- units::drop_units(st_area(ind_esp_inters))/1000000
}
if(!any(grepl('^ind_esp_inters$', ls())) && interactive()){
print(ind_esp_inters)
}
Distancia a accesos.
objeto <- 'osm_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'OSM-DIST mean',
umbrales = c(50, 200, 500, 5000),
nombre = 'Distancia a accesos OSM',
ord_cat = 'nin_rev')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 12.76 289.04 534.24 1243.20 1412.68 32795.66 2
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| OSM-DIST mean intervalos | OSM-DIST mean etiquetas | enteros_ordenados |
|---|---|---|
| [12.8,50] | no idóneo | 1 |
| (50,200] | altamente idóneo | 4 |
| (200,500] | moderadamente idóneo | 3 |
| (500,5e+03] | marginalmente idóneo | 2 |
| (5e+03,3.28e+04] | no idóneo | 1 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Estacionalidad térmica.
objeto <- 'tseasonizzo_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'TSEASON-IZZO mean',
umbrales = c(0.8, 1.2, 1.6),
nombre = 'Estacionalidad térmica',
ord_cat = 'ni')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.573 1.195 1.301 1.326 1.477 1.866 105
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| TSEASON-IZZO mean intervalos | TSEASON-IZZO mean etiquetas | enteros_ordenados |
|---|---|---|
| [0.573,0.8] | no idóneo | 1 |
| (0.8,1.2] | marginalmente idóneo | 2 |
| (1.2,1.6] | moderadamente idóneo | 3 |
| (1.6,1.87] | altamente idóneo | 4 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Estacionalidad pluviométrica.
objeto <- 'pseasonizzo_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'PSEASON-IZZO mean',
umbrales = c(30, 40, 50),
nombre = 'Estacionalidad pluviométrica',
ord_cat = 'ni')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 19.51 31.14 43.51 42.76 52.55 89.60 105
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| PSEASON-IZZO mean intervalos | PSEASON-IZZO mean etiquetas | enteros_ordenados |
|---|---|---|
| [19.5,30] | no idóneo | 1 |
| (30,40] | marginalmente idóneo | 2 |
| (40,50] | moderadamente idóneo | 3 |
| (50,89.6] | altamente idóneo | 4 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
# Para comparar con CHELSA
# objeto <- 'chbio15_rcl'
# assign(
# objeto,
# generar_resumen_grafico_estadistico_criterios(
# variable = 'CH-BIO bio15 precipitation seasonality',
# umbrales = c(300, 400, 500),
# nombre = 'Estacionalidad pluviométrica',
# ord_cat = 'ni')
# )
# get(objeto)[c('violin', 'mapa_con_pais', 'intervalos_y_etiquetas_kable')]
# # clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Heterogeneidad de hábitat.
objeto <- 'hethab_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'GHH coefficient_of_variation_1km',
umbrales = c(250, 500, 1500),
nombre = 'Heterogeneidad de hábitat',
ord_cat = 'in')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 317.6 399.6 481.4 529.5 3563.4
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| GHH coefficient_of_variation_1km intervalos | GHH coefficient_of_variation_1km etiquetas | enteros_ordenados |
|---|---|---|
| [0,250] | altamente idóneo | 4 |
| (250,500] | moderadamente idóneo | 3 |
| (500,1.5e+03] | marginalmente idóneo | 2 |
| (1.5e+03,3.56e+03] | no idóneo | 1 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Distancia a cuerpos de agua y humedales.
objeto <- 'wbwdist_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'WBW-DIST mean',
umbrales = c(1000, 2000, 3000),
nombre = 'Distancia a cuerpos de agua y humedales',
ord_cat = 'ni')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 2698 6069 7134 10545 26424
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| WBW-DIST mean intervalos | WBW-DIST mean etiquetas | enteros_ordenados |
|---|---|---|
| [0,1e+03] | no idóneo | 1 |
| (1e+03,2e+03] | marginalmente idóneo | 2 |
| (2e+03,3e+03] | moderadamente idóneo | 3 |
| (3e+03,2.64e+04] | altamente idóneo | 4 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Pendiente.
objeto <- 'slope_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'G90 Slope',
umbrales = c(3, 9, 15),
nombre = 'Pendiente promedio',
ord_cat = 'in')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.370 4.489 6.773 10.840 32.705
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| G90 Slope intervalos | G90 Slope etiquetas | enteros_ordenados |
|---|---|---|
| [0,3] | altamente idóneo | 4 |
| (3,9] | moderadamente idóneo | 3 |
| (9,15] | marginalmente idóneo | 2 |
| (15,32.7] | no idóneo | 1 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Horas de insolación.
objeto <- 'insol_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'YINSOLTIME mean',
umbrales = c(3900, 4100, 4300),
nombre = 'Horas de insolación',
ord_cat = 'ni')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 3176 4092 4296 4232 4421 4483 104
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| YINSOLTIME mean intervalos | YINSOLTIME mean etiquetas | enteros_ordenados |
|---|---|---|
| [3.18e+03,3.9e+03] | no idóneo | 1 |
| (3.9e+03,4.1e+03] | marginalmente idóneo | 2 |
| (4.1e+03,4.3e+03] | moderadamente idóneo | 3 |
| (4.3e+03,4.48e+03] | altamente idóneo | 4 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
Elevación.
objeto <- 'ele_rcl'
assign(
objeto,
generar_resumen_grafico_estadistico_criterios(
variable = 'CGIAR-ELE mean',
umbrales = c(200, 400, 800),
nombre = 'Elevación',
ord_cat = 'ni')
)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -42.00 57.76 186.78 386.79 542.70 2791.69 35
get(objeto)[c('violin', 'mapa_con_pais')]
## $violin
##
## $mapa_con_pais
get(objeto)[['intervalos_y_etiquetas_kable']]
| CGIAR-ELE mean intervalos | CGIAR-ELE mean etiquetas | enteros_ordenados |
|---|---|---|
| (200,400] | marginalmente idóneo | 2 |
| (400,800] | moderadamente idóneo | 3 |
| (800,2.79e+03] | altamente idóneo | 4 |
| [-42,200] | no idóneo | 1 |
# clipr::write_clip(get(objeto)$intervalos_y_etiquetas)
library(kableExtra)
library(tidyverse)
library(ahpsurvey)
estilo_kable <- function(df, titulo = '', cubre_anchura = T) {
df %>% kable(format = 'html', escape = F, booktabs = T, digits = 2, caption = titulo) %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = cubre_anchura)
}
variables <- c(
acce = "distancia a accesos",
temp = "estacionalidad térmica",
pluv = "estacionalidad pluviométrica",
habi = "heterogeneidad de hábitat",
agua = "distancia a cuerpos de agua",
pend = "pendiente",
inso = "horas de insolación",
elev = "elevación"
)
col_ord <- as.vector(sapply(as.data.frame(combn(names(variables), 2)), paste0, collapse = '_'))
El método AHP consiste en descomponer un problema complejo en una estructura jerárquica de criterios y subcriterios, que consisten en variables o atributos del terreno en nuestro caso, y luego comparar las alternativas en función de cada uno de estos criterios. Los variables se comparan en parejas (o pares, comparación pareada), en la que se asigna un valor numérico a la importancia relativa de cada criterio en relación con los demás. La evaluación pareada se realiza para cada par único de variables; así, el número de comparaciones posibles es \(\frac{N(N-1)}{2}\)
En nuestro caso, dado que comparamos 8 atributos (variables) en parejas, realizamos un total de \((8\times7)/2=28\) comparaciones. Los atributos seleccionados fueron distancia a accesos, estacionalidad térmica, estacionalidad pluviométrica, heterogeneidad de hábitat, distancia a cuerpos de agua, pendiente, horas de insolación, elevación. Para evitar errores de redundancia y garantizar un diseño sistemático y eficiente, empleamos Formularios de Google al cual titulamos como “Formulario de comparación pareada de criterios de identificación de sitios idóneos para una red de observación climática”. Programamos en Python las posibles comparaciones por pares y, seguidamente, a través de la API del Google Workspace, enviamos el diseño para su puesta en línea. Un total de nueve personas del área de climatología, análisis de datos y geografía física, rellenaron el formulario.
Para procesar los resultados de las consultas y generar una tabla de preferencias global con la cual construimos los pesos, en primer lugar generamos una tabla (no confundir con la matriz de comparación por parejas) donde cada columna es una comparación de dos atributos, por ejemplo A y B. Dado que la escala de valoración por parejas del método AHP, en sentido estricto, se apoya en ecuaciones lineales, en el fondo se utiliza una escala ordinal basada en un gradiente, que en el método original, usa números enteros 1 al 9. Esto significa que, al asignar “1”, estamos indicando que los criterios comparados, por ejemplo, A y B, tienen la misma importancia. Del 2 al 9, el criterio B tiene mayor importancia, de manera creciente, que el A. Por otra parte, el grado de importancia de A sobre B se denota por medio de recíprocos {1/2 , 1/3, ..., 1/8, 1/9} y usando un gradiente inverso, es decir, la fracción más pequeña (1/9) indica mayor importancia relativa para el criterio A. Para denotar las valoraciones complementarias, el paquete ahpsurvey permite usar opuestos {-2, -3, ..., -8, -9}, que luego son recodificados a recíprocos en la matriz de comparación por parejas; preferiremos esta opción, es decir, usar opuestos, porque nos facilitó la recodificación con expresiones regulares.
Luego de recoger las valoraciones realizadas por medio de consultas en una tabla, el siguiente paso consistió en obtener la matriz de comparación por parejas, que tiene la siguiente forma:
\[ \mathbf{S_k} =\begin{pmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,N} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,N} \\ \vdots & \vdots & a_{i,j} & \vdots \\ a_{N,1} & a_{N,2} & \cdots & a_{N,N} \end{pmatrix} \]
donde \(a_{i,j}\) representa la comparación del atributo \(i\) y \(j\). Tal como se ha comentado, si \(i\) es más importante que \(j\) en 6 unidades, \(a_{i,j} = 6\) y \(a_{j,i} = \frac{1}{6}\), es decir, el recíproco. Los datos de las comparaciones deben organizarse en esta forma matricial para realizar los análisis subsiguientes.
En el estudio, utilizamos una escala modificada basada en sólo 7 posibles puntuaciones, recodificamos las puntuaciones de formulario de la siguiente manera: el valor 0 a 1 (usamos 0 en los formularios para facilitar la comprensión de la escala a los encuestados); los valores 33%, 66% y 100%, los distribuimos en el rango 2 a 9 de la siguiente manera:
valor_formulario <- c('(100)', '(66)', '(33)', '0', '33', '66', '100')
recod_repartida <- FALSE
if(recod_repartida) {
recodificado_ahp <- round(c(0-(2+3*((9-2)/3)), 0-(2+2*((9-2)/3)), 0-(2+((9-2)/3)),
1,
2+((9-2)/3), 2+2*((9-2)/3), 2+3*((9-2)/3)
),
2)
} else {
recodificado_ahp <- c(-9, -6, -3,
1,
3, 6, 9)
}
data.frame(
`Valor en formulario` = valor_formulario,
`Recodificado a escala AHP original` = recodificado_ahp,
check.names = F) %>%
kable(format = 'html', escape = F, booktabs = T,
caption = 'Tabla de recodificación de puntaciones de formulario a escala AHP original') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| Valor en formulario | Recodificado a escala AHP original |
|---|---|
| (100) | -9 |
| (66) | -6 |
| (33) | -3 |
| 0 | 1 |
| 33 | 3 |
| 66 | 6 |
| 100 | 9 |
Por otro lado, creamos un “diccionario” (vector nombrado variables) de equivalencias entre los nombres largos de columnas de la tabla de resultados (que provienen escritas en el lenguaje natural de los formularios) y nombres cortos de cuatro caracteres. Este diccionario lo utilizamos para recodificar los nombres de las columnas de la tabla de respuestas a nombres cortos, con lo cual mejoramos la legibilidad de las representaciones gráficas y las impresiones de tablas y matrices de resultados.
as.data.frame(variables) %>%
rownames_to_column() %>%
setNames(nm = c('Código', 'Nombre completo')) %>%
kable(format = 'html', escape = F, booktabs = T,
caption = 'Tabla de equivalencias de nombres de las variables evaluadas') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| Código | Nombre completo |
|---|---|
| acce | distancia a accesos |
| temp | estacionalidad térmica |
| pluv | estacionalidad pluviométrica |
| habi | heterogeneidad de hábitat |
| agua | distancia a cuerpos de agua |
| pend | pendiente |
| inso | horas de insolación |
| elev | elevación |
Con la tabla de equivalencias de puntuaciones y el diccionario de nombres, recodificamos programáticas las respuestas obtenidas en los formularios a la escala original del método AHP, así como los nombres de columnas de la tabla de respuestas de comparación de atributos. En primer lugar, mostramos cómo realizamos la recodificación de puntuaciones.
La tabla de resultados de las puntuaciones en bruto (anonimizada), obtenida a partir del rellenado en Google Forms por parte de 9 consultados, se muestra a continuación.
tabla_original <- read_csv('fuentes/respuestas-ahp/respuestas.csv')
tabla_en_bruto <- tabla_original[, -grep('Marca|Opcionalmente', colnames(tabla_original))]
tabla_en_bruto %>%
kable(format = 'html', escape = F, booktabs = T,
caption = 'Tabla de resultados en bruto (anonimizada) obtenida a partir del rellenado del "Formulario de comparación pareada de criterios de identificación de sitios idóneos para una red de observación climática"') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| Valora la importancia relativa de las variables horas de insolación y elevación | Valora la importancia relativa de las variables pendiente y elevación | Valora la importancia relativa de las variables pendiente y horas de insolación | Valora la importancia relativa de las variables distancia a cuerpos de agua y elevación | Valora la importancia relativa de las variables distancia a cuerpos de agua y horas de insolación | Valora la importancia relativa de las variables distancia a cuerpos de agua y pendiente | Valora la importancia relativa de las variables heterogeneidad de hábitat y elevación | Valora la importancia relativa de las variables heterogeneidad de hábitat y horas de insolación | Valora la importancia relativa de las variables heterogeneidad de hábitat y pendiente | Valora la importancia relativa de las variables heterogeneidad de hábitat y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad pluviométrica y elevación | Valora la importancia relativa de las variables estacionalidad pluviométrica y horas de insolación | Valora la importancia relativa de las variables estacionalidad pluviométrica y pendiente | Valora la importancia relativa de las variables estacionalidad pluviométrica y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad pluviométrica y heterogeneidad de hábitat | Valora la importancia relativa de las variables estacionalidad térmica y elevación | Valora la importancia relativa de las variables estacionalidad térmica y horas de insolación | Valora la importancia relativa de las variables estacionalidad térmica y pendiente | Valora la importancia relativa de las variables estacionalidad térmica y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad térmica y heterogeneidad de hábitat | Valora la importancia relativa de las variables estacionalidad térmica y estacionalidad pluviométrica | Valora la importancia relativa de las variables distancia a accesos y elevación | Valora la importancia relativa de las variables distancia a accesos y horas de insolación | Valora la importancia relativa de las variables distancia a accesos y pendiente | Valora la importancia relativa de las variables distancia a accesos y distancia a cuerpos de agua | Valora la importancia relativa de las variables distancia a accesos y heterogeneidad de hábitat | Valora la importancia relativa de las variables distancia a accesos y estacionalidad pluviométrica | Valora la importancia relativa de las variables distancia a accesos y estacionalidad térmica |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 33: Importancia moderada para elevación | 100: Importancia máxima para elevación | 100: Importancia máxima para horas de insolación | 66: Importancia fuerte para elevación | 66: Importancia fuerte para horas de insolación | 0: Igual importancia para distancia a cuerpos de agua y pendiente | 0: Igual importancia para heterogeneidad de hábitat y elevación | (33): Importancia moderada para heterogeneidad de hábitat | (66): Importancia fuerte para heterogeneidad de hábitat | (66): Importancia fuerte para heterogeneidad de hábitat | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | 0: Igual importancia para estacionalidad térmica y elevación | (66): Importancia fuerte para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | 0: Igual importancia para estacionalidad térmica y heterogeneidad de hábitat | 0: Igual importancia para estacionalidad térmica y estacionalidad pluviométrica | 33: Importancia moderada para elevación | 33: Importancia moderada para horas de insolación | (66): Importancia fuerte para distancia a accesos | 0: Igual importancia para distancia a accesos y distancia a cuerpos de agua | 100: Importancia máxima para heterogeneidad de hábitat | 100: Importancia máxima para estacionalidad pluviométrica | 100: Importancia máxima para estacionalidad térmica |
| 33: Importancia moderada para elevación | 33: Importancia moderada para elevación | 66: Importancia fuerte para horas de insolación | 33: Importancia moderada para elevación | 33: Importancia moderada para horas de insolación | (33): Importancia moderada para distancia a cuerpos de agua | 0: Igual importancia para heterogeneidad de hábitat y elevación | 33: Importancia moderada para horas de insolación | (33): Importancia moderada para heterogeneidad de hábitat | 0: Igual importancia para heterogeneidad de hábitat y distancia a cuerpos de agua | 0: Igual importancia para estacionalidad pluviométrica y elevación | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | 0: Igual importancia para estacionalidad térmica y elevación | (33): Importancia moderada para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | (33): Importancia moderada para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | 0: Igual importancia para estacionalidad térmica y estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y elevación | 0: Igual importancia para distancia a accesos y horas de insolación | (33): Importancia moderada para distancia a accesos | 0: Igual importancia para distancia a accesos y distancia a cuerpos de agua | 0: Igual importancia para distancia a accesos y heterogeneidad de hábitat | 33: Importancia moderada para estacionalidad pluviométrica | 33: Importancia moderada para estacionalidad térmica |
| (100): Importancia máxima para horas de insolación | (100): Importancia máxima para pendiente | (100): Importancia máxima para pendiente | (33): Importancia moderada para distancia a cuerpos de agua | (66): Importancia fuerte para distancia a cuerpos de agua | (66): Importancia fuerte para distancia a cuerpos de agua | (66): Importancia fuerte para heterogeneidad de hábitat | (100): Importancia máxima para heterogeneidad de hábitat | (100): Importancia máxima para heterogeneidad de hábitat | (100): Importancia máxima para heterogeneidad de hábitat | (100): Importancia máxima para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para estacionalidad térmica | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos | (100): Importancia máxima para distancia a accesos |
| (66): Importancia fuerte para horas de insolación | 0: Igual importancia para pendiente y elevación | 33: Importancia moderada para horas de insolación | 0: Igual importancia para distancia a cuerpos de agua y elevación | 66: Importancia fuerte para horas de insolación | 0: Igual importancia para distancia a cuerpos de agua y pendiente | 66: Importancia fuerte para elevación | 66: Importancia fuerte para horas de insolación | 0: Igual importancia para heterogeneidad de hábitat y pendiente | 0: Igual importancia para heterogeneidad de hábitat y distancia a cuerpos de agua | 0: Igual importancia para estacionalidad pluviométrica y elevación | 0: Igual importancia para estacionalidad pluviométrica y horas de insolación | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | 66: Importancia fuerte para elevación | 66: Importancia fuerte para horas de insolación | 0: Igual importancia para estacionalidad térmica y pendiente | 0: Igual importancia para estacionalidad térmica y distancia a cuerpos de agua | 0: Igual importancia para estacionalidad térmica y heterogeneidad de hábitat | 66: Importancia fuerte para estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y elevación | 66: Importancia fuerte para horas de insolación | 0: Igual importancia para distancia a accesos y pendiente | 0: Igual importancia para distancia a accesos y distancia a cuerpos de agua | 0: Igual importancia para distancia a accesos y heterogeneidad de hábitat | 66: Importancia fuerte para estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y estacionalidad térmica |
| 33: Importancia moderada para elevación | (33): Importancia moderada para pendiente | (66): Importancia fuerte para pendiente | 0: Igual importancia para distancia a cuerpos de agua y elevación | (66): Importancia fuerte para distancia a cuerpos de agua | 0: Igual importancia para distancia a cuerpos de agua y pendiente | 66: Importancia fuerte para elevación | (33): Importancia moderada para heterogeneidad de hábitat | 0: Igual importancia para heterogeneidad de hábitat y pendiente | 0: Igual importancia para heterogeneidad de hábitat y distancia a cuerpos de agua | (33): Importancia moderada para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | 0: Igual importancia para estacionalidad pluviométrica y heterogeneidad de hábitat | 66: Importancia fuerte para elevación | (66): Importancia fuerte para estacionalidad térmica | (33): Importancia moderada para estacionalidad térmica | 33: Importancia moderada para distancia a cuerpos de agua | 0: Igual importancia para estacionalidad térmica y heterogeneidad de hábitat | 33: Importancia moderada para estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y elevación | (33): Importancia moderada para distancia a accesos | (33): Importancia moderada para distancia a accesos | 33: Importancia moderada para distancia a cuerpos de agua | 33: Importancia moderada para heterogeneidad de hábitat | 33: Importancia moderada para estacionalidad pluviométrica | 33: Importancia moderada para estacionalidad térmica |
| 33: Importancia moderada para elevación | (66): Importancia fuerte para pendiente | (66): Importancia fuerte para pendiente | (66): Importancia fuerte para distancia a cuerpos de agua | (66): Importancia fuerte para distancia a cuerpos de agua | 0: Igual importancia para distancia a cuerpos de agua y pendiente | 66: Importancia fuerte para elevación | 33: Importancia moderada para horas de insolación | 66: Importancia fuerte para pendiente | 66: Importancia fuerte para distancia a cuerpos de agua | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | (66): Importancia fuerte para estacionalidad térmica | 0: Igual importancia para estacionalidad térmica y estacionalidad pluviométrica | (66): Importancia fuerte para distancia a accesos | (66): Importancia fuerte para distancia a accesos | (66): Importancia fuerte para distancia a accesos | (66): Importancia fuerte para distancia a accesos | (33): Importancia moderada para distancia a accesos | 0: Igual importancia para distancia a accesos y estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y estacionalidad térmica |
| 66: Importancia fuerte para elevación | 66: Importancia fuerte para elevación | (33): Importancia moderada para pendiente | 100: Importancia máxima para elevación | (33): Importancia moderada para distancia a cuerpos de agua | 66: Importancia fuerte para pendiente | (33): Importancia moderada para heterogeneidad de hábitat | (100): Importancia máxima para heterogeneidad de hábitat | (66): Importancia fuerte para heterogeneidad de hábitat | (100): Importancia máxima para heterogeneidad de hábitat | (66): Importancia fuerte para estacionalidad pluviométrica | (100): Importancia máxima para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | 66: Importancia fuerte para heterogeneidad de hábitat | 66: Importancia fuerte para elevación | 0: Igual importancia para estacionalidad térmica y horas de insolación | 66: Importancia fuerte para pendiente | (33): Importancia moderada para estacionalidad térmica | 100: Importancia máxima para heterogeneidad de hábitat | 66: Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para distancia a accesos | (100): Importancia máxima para distancia a accesos | (66): Importancia fuerte para distancia a accesos | (100): Importancia máxima para distancia a accesos | (33): Importancia moderada para distancia a accesos | (33): Importancia moderada para distancia a accesos | (100): Importancia máxima para distancia a accesos |
| 0: Igual importancia para horas de insolación y elevación | 0: Igual importancia para pendiente y elevación | (66): Importancia fuerte para pendiente | 33: Importancia moderada para elevación | 0: Igual importancia para distancia a cuerpos de agua y horas de insolación | 66: Importancia fuerte para pendiente | 0: Igual importancia para heterogeneidad de hábitat y elevación | 33: Importancia moderada para horas de insolación | (66): Importancia fuerte para heterogeneidad de hábitat | 66: Importancia fuerte para distancia a cuerpos de agua | 0: Igual importancia para estacionalidad pluviométrica y elevación | (33): Importancia moderada para estacionalidad pluviométrica | 100: Importancia máxima para pendiente | 33: Importancia moderada para distancia a cuerpos de agua | (66): Importancia fuerte para estacionalidad pluviométrica | 33: Importancia moderada para elevación | 0: Igual importancia para estacionalidad térmica y horas de insolación | (33): Importancia moderada para estacionalidad térmica | 33: Importancia moderada para distancia a cuerpos de agua | (33): Importancia moderada para estacionalidad térmica | 33: Importancia moderada para estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y elevación | 0: Igual importancia para distancia a accesos y horas de insolación | 66: Importancia fuerte para pendiente | (33): Importancia moderada para distancia a accesos | 33: Importancia moderada para heterogeneidad de hábitat | 33: Importancia moderada para estacionalidad pluviométrica | 0: Igual importancia para distancia a accesos y estacionalidad térmica |
| (66): Importancia fuerte para horas de insolación | 0: Igual importancia para pendiente y elevación | 66: Importancia fuerte para horas de insolación | (33): Importancia moderada para distancia a cuerpos de agua | 33: Importancia moderada para horas de insolación | (33): Importancia moderada para distancia a cuerpos de agua | 0: Igual importancia para heterogeneidad de hábitat y elevación | 33: Importancia moderada para horas de insolación | (33): Importancia moderada para heterogeneidad de hábitat | 33: Importancia moderada para distancia a cuerpos de agua | (66): Importancia fuerte para estacionalidad pluviométrica | 0: Igual importancia para estacionalidad pluviométrica y horas de insolación | (66): Importancia fuerte para estacionalidad pluviométrica | (66): Importancia fuerte para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad pluviométrica | (33): Importancia moderada para estacionalidad térmica | 0: Igual importancia para estacionalidad térmica y horas de insolación | (33): Importancia moderada para estacionalidad térmica | (33): Importancia moderada para estacionalidad térmica | (33): Importancia moderada para estacionalidad térmica | 0: Igual importancia para estacionalidad térmica y estacionalidad pluviométrica | (33): Importancia moderada para distancia a accesos | 33: Importancia moderada para horas de insolación | (33): Importancia moderada para distancia a accesos | (33): Importancia moderada para distancia a accesos | 0: Igual importancia para distancia a accesos y heterogeneidad de hábitat | 33: Importancia moderada para estacionalidad pluviométrica | 33: Importancia moderada para estacionalidad térmica |
Utilizamos una forma muy eficiente de recodificar, que consistió en aplicar expresiones regulares a las respuestas originales para extraer el valor de interés (e.g. “33”), y luego empleamos la función match para asociar dicha puntuación con su correspondiente valor en la escala AHP original.
tabla_recodificada <- sapply(
tabla_en_bruto[, grep('^Valora.*', colnames(tabla_en_bruto))],
function(x){
sustituido <- gsub('(^[0-9]*|\\([0-9]*\\)):.*', '\\1', x)
# paste(sustituido, '=', reescalado[match(sustituido, valor_formulario)]) #For testing
recodificado_ahp[match(sustituido, valor_formulario)]
})
tabla_recodificada %>%
kable(format = 'html', escape = F, booktabs = T,
caption = 'Tabla de puntaciones recodificadas') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| Valora la importancia relativa de las variables horas de insolación y elevación | Valora la importancia relativa de las variables pendiente y elevación | Valora la importancia relativa de las variables pendiente y horas de insolación | Valora la importancia relativa de las variables distancia a cuerpos de agua y elevación | Valora la importancia relativa de las variables distancia a cuerpos de agua y horas de insolación | Valora la importancia relativa de las variables distancia a cuerpos de agua y pendiente | Valora la importancia relativa de las variables heterogeneidad de hábitat y elevación | Valora la importancia relativa de las variables heterogeneidad de hábitat y horas de insolación | Valora la importancia relativa de las variables heterogeneidad de hábitat y pendiente | Valora la importancia relativa de las variables heterogeneidad de hábitat y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad pluviométrica y elevación | Valora la importancia relativa de las variables estacionalidad pluviométrica y horas de insolación | Valora la importancia relativa de las variables estacionalidad pluviométrica y pendiente | Valora la importancia relativa de las variables estacionalidad pluviométrica y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad pluviométrica y heterogeneidad de hábitat | Valora la importancia relativa de las variables estacionalidad térmica y elevación | Valora la importancia relativa de las variables estacionalidad térmica y horas de insolación | Valora la importancia relativa de las variables estacionalidad térmica y pendiente | Valora la importancia relativa de las variables estacionalidad térmica y distancia a cuerpos de agua | Valora la importancia relativa de las variables estacionalidad térmica y heterogeneidad de hábitat | Valora la importancia relativa de las variables estacionalidad térmica y estacionalidad pluviométrica | Valora la importancia relativa de las variables distancia a accesos y elevación | Valora la importancia relativa de las variables distancia a accesos y horas de insolación | Valora la importancia relativa de las variables distancia a accesos y pendiente | Valora la importancia relativa de las variables distancia a accesos y distancia a cuerpos de agua | Valora la importancia relativa de las variables distancia a accesos y heterogeneidad de hábitat | Valora la importancia relativa de las variables distancia a accesos y estacionalidad pluviométrica | Valora la importancia relativa de las variables distancia a accesos y estacionalidad térmica |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 9 | 9 | 6 | 6 | 1 | 1 | -3 | -6 | -6 | -6 | -6 | -9 | -9 | -3 | 1 | -6 | -9 | -9 | 1 | 1 | 3 | 3 | -6 | 1 | 9 | 9 | 9 |
| 3 | 3 | 6 | 3 | 3 | -3 | 1 | 3 | -3 | 1 | 1 | -6 | -6 | -3 | -6 | 1 | -3 | -6 | -3 | -6 | 1 | 1 | 1 | -3 | 1 | 1 | 3 | 3 |
| -9 | -9 | -9 | -3 | -6 | -6 | -6 | -9 | -9 | -9 | -9 | -9 | -6 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 |
| -6 | 1 | 3 | 1 | 6 | 1 | 6 | 6 | 1 | 1 | 1 | 1 | -6 | -6 | -6 | 6 | 6 | 1 | 1 | 1 | 6 | 1 | 6 | 1 | 1 | 1 | 6 | 1 |
| 3 | -3 | -6 | 1 | -6 | 1 | 6 | -3 | 1 | 1 | -3 | -6 | -6 | -3 | 1 | 6 | -6 | -3 | 3 | 1 | 3 | 1 | -3 | -3 | 3 | 3 | 3 | 3 |
| 3 | -6 | -6 | -6 | -6 | 1 | 6 | 3 | 6 | 6 | -6 | -6 | -3 | -3 | -6 | -6 | -6 | -6 | -6 | -6 | 1 | -6 | -6 | -6 | -6 | -3 | 1 | 1 |
| 6 | 6 | -3 | 9 | -3 | 6 | -3 | -9 | -6 | -9 | -6 | -9 | -6 | -6 | 6 | 6 | 1 | 6 | -3 | 9 | 6 | -6 | -9 | -6 | -9 | -3 | -3 | -9 |
| 1 | 1 | -6 | 3 | 1 | 6 | 1 | 3 | -6 | 6 | 1 | -3 | 9 | 3 | -6 | 3 | 1 | -3 | 3 | -3 | 3 | 1 | 1 | 6 | -3 | 3 | 3 | 1 |
| -6 | 1 | 6 | -3 | 3 | -3 | 1 | 3 | -3 | 3 | -6 | 1 | -6 | -6 | -3 | -3 | 1 | -3 | -3 | -3 | 1 | -3 | 3 | -3 | -3 | 1 | 3 | 3 |
En segundo lugar, aplicamos la recodificación de nombres de columnas de la tabla de respuestas, que originalmente eran transcripciones de las preguntas del formulario de Google. Este paso nos ayudó a representar nombres más cortos en la tabla que posteriormente usamos como insumo (ver tabla 15) para crear la matriz de comparación por parejas del método AHP.
tabla_col_renom <- tabla_recodificada
cambiar_nombre_por_variable <- function(primera=T) {
names(
variables[match(
gsub('(^.*variables )(.*?)( y )(.*$)',
ifelse(primera, '\\2', '\\4'),
colnames(tabla_col_renom)),
variables)])
}
colnames(tabla_col_renom) <- paste0(
cambiar_nombre_por_variable(),
'_',
cambiar_nombre_por_variable(primera = F)
)
tabla_col_renom %>%
kable(format = 'html', escape = F, booktabs = T,
caption = 'Tabla de columnas renombradas (adaptada para la generación de la matriz de comparación en parejas)') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| inso_elev | pend_elev | pend_inso | agua_elev | agua_inso | agua_pend | habi_elev | habi_inso | habi_pend | habi_agua | pluv_elev | pluv_inso | pluv_pend | pluv_agua | pluv_habi | temp_elev | temp_inso | temp_pend | temp_agua | temp_habi | temp_pluv | acce_elev | acce_inso | acce_pend | acce_agua | acce_habi | acce_pluv | acce_temp |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 9 | 9 | 6 | 6 | 1 | 1 | -3 | -6 | -6 | -6 | -6 | -9 | -9 | -3 | 1 | -6 | -9 | -9 | 1 | 1 | 3 | 3 | -6 | 1 | 9 | 9 | 9 |
| 3 | 3 | 6 | 3 | 3 | -3 | 1 | 3 | -3 | 1 | 1 | -6 | -6 | -3 | -6 | 1 | -3 | -6 | -3 | -6 | 1 | 1 | 1 | -3 | 1 | 1 | 3 | 3 |
| -9 | -9 | -9 | -3 | -6 | -6 | -6 | -9 | -9 | -9 | -9 | -9 | -6 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 | -9 |
| -6 | 1 | 3 | 1 | 6 | 1 | 6 | 6 | 1 | 1 | 1 | 1 | -6 | -6 | -6 | 6 | 6 | 1 | 1 | 1 | 6 | 1 | 6 | 1 | 1 | 1 | 6 | 1 |
| 3 | -3 | -6 | 1 | -6 | 1 | 6 | -3 | 1 | 1 | -3 | -6 | -6 | -3 | 1 | 6 | -6 | -3 | 3 | 1 | 3 | 1 | -3 | -3 | 3 | 3 | 3 | 3 |
| 3 | -6 | -6 | -6 | -6 | 1 | 6 | 3 | 6 | 6 | -6 | -6 | -3 | -3 | -6 | -6 | -6 | -6 | -6 | -6 | 1 | -6 | -6 | -6 | -6 | -3 | 1 | 1 |
| 6 | 6 | -3 | 9 | -3 | 6 | -3 | -9 | -6 | -9 | -6 | -9 | -6 | -6 | 6 | 6 | 1 | 6 | -3 | 9 | 6 | -6 | -9 | -6 | -9 | -3 | -3 | -9 |
| 1 | 1 | -6 | 3 | 1 | 6 | 1 | 3 | -6 | 6 | 1 | -3 | 9 | 3 | -6 | 3 | 1 | -3 | 3 | -3 | 3 | 1 | 1 | 6 | -3 | 3 | 3 | 1 |
| -6 | 1 | 6 | -3 | 3 | -3 | 1 | 3 | -3 | 3 | -6 | 1 | -6 | -6 | -3 | -3 | 1 | -3 | -3 | -3 | 1 | -3 | 3 | -3 | -3 | 1 | 3 | 3 |
El conjunto de datos de la tabla 15 recoge las respuestas dadas por las 9 personas consultada, cada una compuesta por 28 comparaciones en parejas de criterios (8 criterios). Analicemos algunos ejemplos para ilustrar el flujo seguido en la recodificación y los cambios de nombres de columnas de la tabla de resultados.
La primera fila contiene las valoraciones realizadas por la persona consultada número 1. En la primera pregunta, “Valora la importancia relativa de las variables horas de insolación y elevación”, el consultado respondió “33: Importancia moderada para elevación” (ver tabla 13). Dicha valoración fue recodificada a puntuaciones AHP con el valor 3 (ver tabla 14); nótese que el valor recodificado es positivo, dado que el criterio que recibió la mayor importancia fue el que ocupaba la segunda posición en la pregunta.
Finalmente, tras realizar el renombrado, la columna en cuestión paso de nombrarse “Valora la importancia relativa de las variables horas de insolación y elevación” a inso_elev (ver tabla 15). Esta cambio nos permitirá manejar atributos cortos en la matriz de comparación por parejas.
Ilustremos el uso del signo con otro ejemplo. Observemos la respuesta de la persona 1 a la octava pregunta (“Valora la importancia relativa de las variables heterogeneidad de hábitat y horas de insolación”). Notaremos que su respuesta fue “(33): Importancia moderada para heterogeneidad de hábitat”, dando mayor importancia al criterio que ocupa la primera posición. Esta valoración se recodificó a -3 (negativo) en la escala AHP, y la columna fue renombrada a habi_inso. La recodificación valores y de nombres de columnas es un paso crítico del AHP, porque es común la comisión de errores que terminan “colándose” hacia insumos del análisis. Es además el paso previo a la construcción de una matriz de comparación en parejas consistente, que es el insumo principal del AHP.
Este paso resultó relativamente fácil, puesto que en pasos posteriores se elaboraron los insumos que necesita la función ahp.mat del paquete ahpsurvey. Es importante remarcar una particularidad sobre el orden las columnas. El parámetro atts de la función ahp.mat debe contener un vector con los nombres de los atributos comparados, en nuestro caso, las 8 variables ya mencionadas. El orden de este vector es muy importante, pues la función ahp.mat espera que las columnas de la tabla fuente se encuentren en el siguiente orden: atributo1_atributo2, atributo1_atributo3, …, atributo1_atributo8, atributo2_atributo3, atributo2_atributo4, …, atributo2_atributo8, …, atributo7_atributo8. Este objeto ya fue creado arriba mediante la función combn, y fue nombrado como col_ord. Por lo tanto, reordenaremos las columnas de la tabla de respuestas recodificadas usando dicho vector.
matriz_ahp <- tabla_col_renom[, col_ord] %>%
ahp.mat(atts = names(variables), negconvert = TRUE)
map(matriz_ahp,
~ kable(x = .x, format = 'html', escape = F, booktabs = T, digits = 2) %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
)
[[1]]
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 0.11 | 0.11 | 0.11 | 1 | 6 | 0.33 | 0.33 |
| temp | 9.00 | 1.00 | 1.00 | 1.00 | 9 | 9 | 6.00 | 1.00 |
| pluv | 9.00 | 1.00 | 1.00 | 3.00 | 9 | 9 | 6.00 | 6.00 |
| habi | 9.00 | 1.00 | 0.33 | 1.00 | 6 | 6 | 3.00 | 1.00 |
| agua | 1.00 | 0.11 | 0.11 | 0.17 | 1 | 1 | 0.17 | 0.17 |
| pend | 0.17 | 0.11 | 0.11 | 0.17 | 1 | 1 | 0.11 | 0.11 |
| inso | 3.00 | 0.17 | 0.17 | 0.33 | 6 | 9 | 1.00 | 0.33 |
| elev | 3.00 | 1.00 | 0.17 | 1.00 | 6 | 9 | 3.00 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 0.33 | 0.33 | 1.00 | 1.00 | 3 | 1.00 | 1.00 |
| temp | 3.00 | 1.00 | 1.00 | 6.00 | 3.00 | 6 | 3.00 | 1.00 |
| pluv | 3.00 | 1.00 | 1.00 | 6.00 | 3.00 | 6 | 6.00 | 1.00 |
| habi | 1.00 | 0.17 | 0.17 | 1.00 | 1.00 | 3 | 0.33 | 1.00 |
| agua | 1.00 | 0.33 | 0.33 | 1.00 | 1.00 | 3 | 0.33 | 0.33 |
| pend | 0.33 | 0.17 | 0.17 | 0.33 | 0.33 | 1 | 0.17 | 0.33 |
| inso | 1.00 | 0.33 | 0.17 | 3.00 | 3.00 | 6 | 1.00 | 0.33 |
| elev | 1.00 | 1.00 | 1.00 | 1.00 | 3.00 | 3 | 3.00 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 9.00 | 9.00 | 9.00 | 9.00 | 9.00 | 9.00 | 9 |
| temp | 0.11 | 1.00 | 9.00 | 9.00 | 9.00 | 9.00 | 9.00 | 9 |
| pluv | 0.11 | 0.11 | 1.00 | 9.00 | 9.00 | 6.00 | 9.00 | 9 |
| habi | 0.11 | 0.11 | 0.11 | 1.00 | 9.00 | 9.00 | 9.00 | 6 |
| agua | 0.11 | 0.11 | 0.11 | 0.11 | 1.00 | 6.00 | 6.00 | 3 |
| pend | 0.11 | 0.11 | 0.17 | 0.11 | 0.17 | 1.00 | 9.00 | 9 |
| inso | 0.11 | 0.11 | 0.11 | 0.11 | 0.17 | 0.11 | 1.00 | 9 |
| elev | 0.11 | 0.11 | 0.11 | 0.17 | 0.33 | 0.11 | 0.11 | 1 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1 | 1 | 0.17 | 1 | 1 | 1 | 0.17 | 1.00 |
| temp | 1 | 1 | 0.17 | 1 | 1 | 1 | 0.17 | 0.17 |
| pluv | 6 | 6 | 1.00 | 6 | 6 | 6 | 1.00 | 1.00 |
| habi | 1 | 1 | 0.17 | 1 | 1 | 1 | 0.17 | 0.17 |
| agua | 1 | 1 | 0.17 | 1 | 1 | 1 | 0.17 | 1.00 |
| pend | 1 | 1 | 0.17 | 1 | 1 | 1 | 0.33 | 1.00 |
| inso | 6 | 6 | 1.00 | 6 | 6 | 3 | 1.00 | 6.00 |
| elev | 1 | 6 | 1.00 | 6 | 1 | 1 | 0.17 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 0.33 | 0.33 | 0.33 | 0.33 | 3.00 | 3 | 1.00 |
| temp | 3.00 | 1.00 | 0.33 | 1.00 | 0.33 | 3.00 | 6 | 0.17 |
| pluv | 3.00 | 3.00 | 1.00 | 1.00 | 3.00 | 6.00 | 6 | 3.00 |
| habi | 3.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 3 | 0.17 |
| agua | 3.00 | 3.00 | 0.33 | 1.00 | 1.00 | 1.00 | 6 | 1.00 |
| pend | 0.33 | 0.33 | 0.17 | 1.00 | 1.00 | 1.00 | 6 | 3.00 |
| inso | 0.33 | 0.17 | 0.17 | 0.33 | 0.17 | 0.17 | 1 | 0.33 |
| elev | 1.00 | 6.00 | 0.33 | 6.00 | 1.00 | 0.33 | 3 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 1.00 | 1.00 | 3 | 6.00 | 6.00 | 6.00 | 6.00 |
| temp | 1.00 | 1.00 | 1.00 | 6 | 6.00 | 6.00 | 6.00 | 6.00 |
| pluv | 1.00 | 1.00 | 1.00 | 6 | 3.00 | 3.00 | 6.00 | 6.00 |
| habi | 0.33 | 0.17 | 0.17 | 1 | 0.17 | 0.17 | 0.33 | 0.17 |
| agua | 0.17 | 0.17 | 0.33 | 6 | 1.00 | 1.00 | 6.00 | 6.00 |
| pend | 0.17 | 0.17 | 0.33 | 6 | 1.00 | 1.00 | 6.00 | 6.00 |
| inso | 0.17 | 0.17 | 0.17 | 3 | 0.17 | 0.17 | 1.00 | 0.33 |
| elev | 0.17 | 0.17 | 0.17 | 6 | 0.17 | 0.17 | 3.00 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 9.00 | 3.00 | 3.00 | 9.00 | 6.00 | 9 | 6.00 |
| temp | 0.11 | 1.00 | 0.17 | 0.11 | 3.00 | 0.17 | 1 | 0.17 |
| pluv | 0.33 | 6.00 | 1.00 | 0.17 | 6.00 | 6.00 | 9 | 6.00 |
| habi | 0.33 | 9.00 | 6.00 | 1.00 | 9.00 | 6.00 | 9 | 3.00 |
| agua | 0.11 | 0.33 | 0.17 | 0.11 | 1.00 | 0.17 | 3 | 0.11 |
| pend | 0.17 | 6.00 | 0.17 | 0.17 | 6.00 | 1.00 | 3 | 0.17 |
| inso | 0.11 | 1.00 | 0.11 | 0.11 | 0.33 | 0.33 | 1 | 0.17 |
| elev | 0.17 | 6.00 | 0.17 | 0.33 | 9.00 | 6.00 | 6 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 1.00 | 0.33 | 0.33 | 3.00 | 0.17 | 1.00 | 1.00 |
| temp | 1.00 | 1.00 | 0.33 | 3.00 | 0.33 | 3.00 | 1.00 | 0.33 |
| pluv | 3.00 | 3.00 | 1.00 | 6.00 | 0.33 | 0.11 | 3.00 | 1.00 |
| habi | 3.00 | 0.33 | 0.17 | 1.00 | 0.17 | 6.00 | 0.33 | 1.00 |
| agua | 0.33 | 3.00 | 3.00 | 6.00 | 1.00 | 0.17 | 1.00 | 0.33 |
| pend | 6.00 | 0.33 | 9.00 | 0.17 | 6.00 | 1.00 | 6.00 | 1.00 |
| inso | 1.00 | 1.00 | 0.33 | 3.00 | 1.00 | 0.17 | 1.00 | 1.00 |
| elev | 1.00 | 3.00 | 1.00 | 1.00 | 3.00 | 1.00 | 1.00 | 1.00 |
| acce | temp | pluv | habi | agua | pend | inso | elev | |
|---|---|---|---|---|---|---|---|---|
| acce | 1.00 | 0.33 | 0.33 | 1.00 | 3.00 | 3 | 0.33 | 3 |
| temp | 3.00 | 1.00 | 1.00 | 3.00 | 3.00 | 3 | 1.00 | 3 |
| pluv | 3.00 | 1.00 | 1.00 | 3.00 | 6.00 | 6 | 1.00 | 6 |
| habi | 1.00 | 0.33 | 0.33 | 1.00 | 0.33 | 3 | 0.33 | 1 |
| agua | 0.33 | 0.33 | 0.17 | 3.00 | 1.00 | 3 | 0.33 | 3 |
| pend | 0.33 | 0.33 | 0.17 | 0.33 | 0.33 | 1 | 0.17 | 1 |
| inso | 3.00 | 1.00 | 1.00 | 3.00 | 3.00 | 6 | 1.00 | 6 |
| elev | 0.33 | 0.33 | 0.17 | 1.00 | 0.33 | 1 | 0.17 | 1 |
Como primera evaluación de la calidad de la matriz de comparación en parejas, calculamos las preferencias de ponderación individuales de los consultados, para generar una tabla resumen con los pesos de preferencia de cada consultado. Este cálculo se realiza normalizando las matrices para que todas las columnas sumen 1, y luego se calculan los promedios por filas como los pesos de preferencia de cada atributo. Los promedios se pueden obtener de 4 formas posibles: media aritmética, media geométrica, media cuadrática y vector propio (eigen vector).
Usando las diferencias de los promedios de preferencias individuales, evaluamos las diferencias máximas entre métodos, como forma indirecta de determinar si existe consistencia en las valoraciones dadas por cada personas consultada; diferencias máximas mayores de 0.05 se consideran, a priori, dignas de escrutinio posterior (ver figura 1).
eigentrue <- ahp.indpref(matriz_ahp, atts = names(variables), method = "eigen")
geom <- ahp.indpref(matriz_ahp, atts = names(variables), method = "arithmetic")
error <- data.frame(id = 1:length(matriz_ahp), maxdiff = apply(abs(eigentrue - geom), 1, max))
error %>%
ggplot(aes(x = id, y = maxdiff)) +
geom_point() +
geom_hline(yintercept = 0.05, linetype = "dashed", color = "red") +
geom_hline(yintercept = 0, color = "gray50") +
scale_x_continuous(breaks = seq_len(nrow(tabla_col_renom)), "ID de persona consultada") +
scale_y_continuous("Diferencia máxima") +
theme_minimal()
Figure 1: Diferencias de los promedios de preferencias individuales entre los métodos “media aritmética” y “valor propio”
En este caso, la persona consultada número 3 parece haber aportado respuestas inconsistentes, por lo que este primer resultado, a priori, nos anima a revisar a fondo la consistencia de la matriz de comparación. A tal efecto, existen métricas específicas y mucho más robustas que el método de las diferencias mostrado arriba, para evaluar la consistencia de la matriz de comparación, como es por ejemplo la ratio o razón de consistencia \(CR\), analizada en la próxima sección.
La métrica convencional para evaluar la consistencia de las respuestas aportadas por las personas consultadas es la razón de consistencia, la cual viene dada por la fórmula siguiente:
\[CR = \bigg(\frac{\lambda_{max}-n}{n-1}\bigg)\bigg(\frac{1}{RI}\bigg)\]
donde \(CR\) es la razón de consistencia, \(\lambda_{max}\) es el valor propio más grande del vector de comparación por parejas, \(n\) es el número de atributos, en nuestro caso, \(8\), y \(RI\) es un índice aleatorio que puede ser provisto por el usuario a partir de simulaciones, que con el paquete ahpsurvey se puede generar mediante la función ahp.ri. El conjunto de \(RI\) a continuación se generó a partir de ahp.ri con 500000 simulaciones (ver tabla 16), y están contenidas en la viñeta principal de la documentación del paquete ahpsurvey (Cho 2019):
ri_sim <- t(data.frame(RI = c(0.0000000, 0.0000000, 0.5251686, 0.8836651, 1.1081014, 1.2492774, 1.3415514, 1.4048466, 1.4507197, 1.4857266, 1.5141022,1.5356638, 1.5545925, 1.5703498, 1.5839958)))
colnames(ri_sim) <- 1:15
ri_sim %>%
kable(format = 'html', escape = F, booktabs = T, digits = 2,
caption = 'Índices aleatorios generados por la función ahp.ri con 500000 simulaciones para 1 a 15 atributos') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| RI | 0 | 0 | 0.53 | 0.88 | 1.11 | 1.25 | 1.34 | 1.4 | 1.45 | 1.49 | 1.51 | 1.54 | 1.55 | 1.57 | 1.58 |
Para fines de impresión, la tabla sólo muestra dos dígitos, pero en el caso concreto de 8 atributos, el \(RI\) a usar sería 1.4048466. Adicionalmente, comprobamos este resultado por nuestra cuenta. Para ello usamos la función ahp.ri y generamos un \(RI\) con 10000 simulaciones para 8 atributos (argumento dim de la referida función), fijando la aleatorización en el número 99.
tiempo_10k <- system.time(probandoRI <- ahp.ri(nsims = 10000, dim = 8, seed = 99))
El tiempo de cómputo fue relativamente pequeño (~ 2 segundos) y el resultado para \(RI\) es 1.399982, el cual se aproxima bastante al generado por Cho (2019) (tabla 16). Si generásemos un \(RI\) con 500000 simulaciones, nos tomaría al menos un minuto y medio en una PC de altas prestaciones (o varios minutos en una PC común), y el resultado sería bastante parecido al mostrado por Cho (2019), por lo que nos parece conveniente usar este último (\(RI=1.4048466\)).
RI <- ri_sim[8]
Con este índice aleatorio, calculamos la razón de consistencia CR de las respuestas aportadas por cada persona consultada, mediante la función ahp.cr aplicada a la matriz de comparación en parejas. La tabla 17 resume el cómputo de esta métrica.
cr <- matriz_ahp %>% ahp.cr(atts = names(variables), ri = RI)
data.frame(`Persona consultada` = seq_along(cr), CR = cr, check.names = F) %>%
estilo_kable(titulo = 'Razones de consistencia (consistency ratio) por persona consultada',
cubre_anchura = F) %>%
kable_styling(position = 'left') %>%
column_spec(column = 1:2, width = "10em")
| Persona consultada | CR |
|---|---|
| 1 | 0.09 |
| 2 | 0.07 |
| 3 | 0.47 |
| 4 | 0.07 |
| 5 | 0.23 |
| 6 | 0.15 |
| 7 | 0.17 |
| 8 | 0.60 |
| 9 | 0.06 |
umbral_saaty <- 0.1
umbral_alterno <- 0.15
umbral <- ifelse(recod_repartida, umbral_alterno, umbral_saaty)
Saaty demostró que cuando el \(CR\) es superior a un umbral rígido de 0.1, la elección se considera inconsistente (Thomas L. Saaty 1977). En nuestro caso, elegimos el umbral de 0.1 para \(CR\), por lo que obtuvimos un total de 4 valoraciones consistentes (personas consultadas números 1, 2, 4, 9) y 5 inconsistentes (personas números 3, 5, 6, 7, 8) (comparar con tabla 17).
table(ifelse(cr <= umbral, 'Consistente', 'Inconsistente')) %>% as.data.frame() %>%
setNames(nm = c('Tipo', 'Número de cuestionarios')) %>%
estilo_kable(titulo = 'Número de cuestionarios según consistencia',
cubre_anchura = F) %>%
kable_styling(position = 'left') %>%
column_spec(column = 1:2, width = "10em")
| Tipo | Número de cuestionarios |
|---|---|
| Consistente | 4 |
| Inconsistente | 5 |
Calculamos también las preferencias o prioridades asignadas por cada persona consultada, así como la ponderación correspondiente (peso, valor propio dominante), mediante la función ahp.indpref, que proporciona una relación detallada. La visualización de los diagramas de cajas, gráficos de violín (que son gráficos de densidad en espejo acompañando al diagrama de cajas) y los puntos (jitter), todos superpuestos, resulta útil para visualizar la heterogeneidad de las ponderaciones de cada persona consultada por atributo. Aunque esta este tipo de gráfico es más conveniente para un número mayor de personas consultadas, la visualización con nuestros datos es bastante expresiva.
cr_indicador <- cr %>%
data.frame() %>%
mutate(`Persona consultada` = seq_along(cr), `CR indicador` = as.factor(ifelse(cr <= umbral, 1, 0))) %>%
select(`CR indicador`, `Persona consultada`)
matriz_ahp %>%
ahp.indpref(names(variables), method = "eigen") %>%
mutate(`Persona consultada` = seq_along(cr)) %>%
left_join(cr_indicador, by = 'Persona consultada') %>%
gather(-matches('Persona|CR'), key = "var", value = "pref") %>%
ggplot(aes(x = var, y = pref)) +
geom_violin(alpha = 0.6, width = 0.8, color = "transparent", fill = "gray") +
geom_jitter(alpha = 0.6, height = 0, width = 0.1, aes(color = `CR indicador`)) +
geom_boxplot(alpha = 0, width = 0.3, color = "#808080") +
scale_x_discrete("Atributo", labels = stringr::str_wrap(variables[sort(names(variables))], width = 10)) +
scale_y_continuous("Peso (valor propio dominante)",
labels = scales::percent,
breaks = c(seq(0,0.7,0.1))) +
guides(color=guide_legend(title=NULL)) +
scale_color_discrete(breaks = c(0,1),
type = c("#F8766D", "#00BA38"),
labels = c(paste("CR >", umbral),
paste("CR <", umbral))) +
labs(NULL, caption = paste("n =", nrow(tabla_col_renom), ",", "CR promedio =",
round(mean(cr),3))) +
theme_minimal() +
theme(legend.position = 'bottom', axis.text.x = element_text(size = 7))
Figure 2: Preferencias individuales por atributo y ratio de consistencia
La figura 2 resume las preferencias asignadas por las personas consultadas, con indicación de la consistencia de las mismas. Las dos estacionalidades, térmica y pluviométrica, así como las horas de insolación debidas a terreno y la elevación, reúnen la mayor parte de las preferencias de respuestas consistentes (puntos verdes); nótese que se han incluido las preferencias de respuestas inconsistentes también (puntos rojos). Por otra parte, los atributos que reciben menor ponderación son distancias a accesos y a cuerpos de agua, heterogeneidad de hábitat y pendiente.
Repitiendo el gráfico de preferencias individuales por atributo y ratio de consistencia, pero usando sólo las respuestas consistentes, obtenemos un claro patrón de preferencia por las dos estacionalidades, las horas de insolación y la elevación.
matriz_ahp[cr_indicador[,1]==1] %>%
ahp.indpref(names(variables), method = "eigen") %>%
mutate(`Persona consultada` = cr_indicador[cr_indicador[,1]==1, 'Persona consultada']) %>%
inner_join(cr_indicador[cr_indicador[,1]==1,], by = 'Persona consultada') %>%
gather(-matches('Persona|CR'), key = "var", value = "pref") %>%
ggplot(aes(x = var, y = pref)) +
geom_violin(alpha = 0.6, width = 0.8, color = "transparent", fill = "gray") +
geom_jitter(alpha = 0.6, height = 0, width = 0.1, color = "#00BA38") +
geom_boxplot(alpha = 0, width = 0.3, color = "#808080") +
scale_x_discrete("Atributo", labels = stringr::str_wrap(variables[sort(names(variables))], width = 10)) +
scale_y_continuous("Peso (valor propio dominante)",
labels = scales::percent,
breaks = c(seq(0,0.7,0.1))) +
guides(color=guide_legend(title=NULL)) +
labs(NULL, caption = paste("n =", nrow(cr_indicador[cr_indicador[,1]==1,]),
",", "CR promedio =",
round(mean(cr[cr_indicador[,1]==1]),3))) +
theme_minimal() +
theme(legend.position = 'bottom', axis.text.x = element_text(size = 7))
Figure 3: Preferencias individuales por atributo y ratio de consistencia, sólo respuestas consistentes
El flujo de procesamiento completo retorna la matriz de pesos de acuerdo con el umbral de consistencia elegido, que en nuestro caso es 0.1. De esta manera, generamos una matriz de pesos sólo con las respuestas consistentes. Verificamos igualmente que la suma de los pesos sea igual a 1.
flujo_completo_ahp <- ahp(df = tabla_col_renom[, col_ord],
atts = names(variables),
negconvert = TRUE,
reciprocal = TRUE,
method = 'arithmetic',
aggmethod = "arithmetic",
qt = 0.2,
censorcr = umbral,
agg = TRUE)
## [1] "Number of observations censored = 5"
# sum(flujo_completo_ahp$aggpref[,1]) == 1
Utilizamos múltiples fuentes cartográficas ráster como variables de territorio para modelizar la idoneidad de sitios candidatos para la instalación de estaciones meteoclimáticas. Originalmente, disponíamos de más de 100 fuentes ráster para realizar nuestros análisis, pero elegimos sólo ocho de ellas por considerarlas relevantes siguiendo recomendaciones de estudios previos (Rojas Briceño et al. 2021). Estas ocho variables fueron ponderadas por el personal experto mediante el proceso descrito anteriormente.
Las fuentes ráster son servidas bajo distintas resoluciones y sistemas de referencia, por lo que fue necesario aplicar algoritmos de reducción y consolidar resultados en una geometría común. Para ello, redujimos todas las fuentes ráster al índice geoespacial de hexágonos H3 (hex bins) (Martínez-Batlle 2022). Probamos distintas resoluciones de dicho índice, y tras algunas pruebas, elegimos la resolución “7”. Con esta resolución, cubrimos el territorio dominicano más un área de influencia con aproximadamente 13,000 hexágonos de ca. 4\(km^2\) cada uno. Dentro de cada hexágono, por medio de estadística zonal, obtuvimos la media de cada variable, la cual utilizamos como estadístico de referencia en la reclasificación descrita a continuación.
Reclasificamos los valores promedio de las ocho variables seleccionadas, aplicando criterios sugeridos por otros autores, así como adaptando umbrales convencionales a la realidad insular (FAO, n.d.; Rojas Briceño et al. 2021). Para facilitar esta tarea, y garantizar reproducibilidad y consistencia, creamos funciones que realizaron la reclasificación de forma semitautomática. Los umbrales elegidos para definir las puntuaciones de criterios, están recogidos en la tabla (ver tabla 19).
puntuaciones_umbrales <- readODS::read_ods('fuentes/umbrales-criterios-ahp/puntuaciones.ods', sheet = 1)
puntuaciones_umbrales %>% kable(format = 'html', escape = F, booktabs = T, digits = 2,
caption = 'Puntuaciones de criterios para la selección de sitios de estaciones meteoclimáticas') %>%
kable_styling(bootstrap_options = c("hover", "condensed"), full_width = T)
| Etiquetas | altamente idóneo | moderadamente idóneo | marginalmente idóneo | no idóneo |
|---|---|---|---|---|
| Escala ordinal | 4 | 3 | 2 | 1 |
| Distancia a accesos (m) [OSM-DIST] | (50,300] | (300,500] | (500,5e+03] | [12.8,50] (5e+03,3.28e+04] |
| Estacionalidad térmica (°C/100x0.1) | (1.5e+03,1.66e+03] | (1.3e+03,1.5e+03] | (1.1e+03,1.3e+03] | [854,1.1e+03] |
| Estacionalidad pluviométrica (kg x m-2 x 0.1) | (500,622] | (400,500] | (300,400] | [222,300] |
| Heterogeneidad de hábitat (coef. variación) | [0,250] | (250,500] | (500,1.5e+03] | (1.5e+03,3.56e+03] |
| Distancia a cuerpos de agua (km) | (3e+03,2.64e+04] | (2e+03,3e+03] | (1e+03,2e+03] | [0,1e+03] |
| Pendiente (°) | [0,3] | (3,9] | (9,15] | (15,32.7] |
| Horas de insolación (horas/año) | (4.3e+03,4.48e+03] | (4.1e+03,4.3e+03] | (3.9e+03,4.1e+03] | [3.18e+03,3.9e+03] |
| Elevación (metros snm) | (800,2.79e+03] | (400,800] | (200,400] | [-42,200] |
TODO